﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIMCFachadaNegocio;
using SIMCObjetoNegocio;

namespace SIMCPresenter
{

    public interface IResumenAporteYRetirosView
    {

        event EventHandler<EventArgs> Iniciar;
        event EventHandler<EventArgs> CambiarPeriodo;


        
        int PortafolioId { get; set; }
        DateTime FechaPortafolio { get; }
        DateTime Fecha { get; }
        DateTime FechaInicial { set; }
        ResumenAportesYRetiros AporteYRetiro { set; }
        Portafolio DatosPortafolio { set; }
        string UsuarioExterno { get; }

        PeriodosDelAnno Periodo { get; }
        List<AporteORetiro> Aportes { set; }
        List<AporteORetiro> Retiros { set; }

        double RendimientoEnPeriodo {  set; }

        double RendimientoAnualizado {  set; }

        bool MostrarRendimiento { set; }
    }

    public class ResumenAporteYRetirosPresenter
    {
        private IResumenAporteYRetirosView mView;

        public ResumenAporteYRetirosPresenter(IResumenAporteYRetirosView view)
        {
            this.mView = view;
            this.Initialize();
        }

        private void Initialize()
        {

            this.mView.Iniciar += new EventHandler<EventArgs>(mView_Iniciar);
            this.mView.CambiarPeriodo += new EventHandler<EventArgs>(mView_CambiarPeriodo);

        }

        void mView_CambiarPeriodo(object sender, EventArgs e)
        {
            try
            {
                FachadaPortafolio fachada = new FachadaPortafolio();
                LlenarAporteYRetiro(mView.PortafolioId, mView.Periodo, mView.Fecha, fachada);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                throw;
            }
        }


        private void mView_Iniciar(object sender, EventArgs e)
        {
            try
            {
                FachadaPortafolio fachada = new FachadaPortafolio();


                if (mView.UsuarioExterno != null)
                {
                    PortafolioSearchCriteria criterio = new PortafolioSearchCriteria(mView.FechaPortafolio) { IdPortafolio = mView.PortafolioId, NombreUsuarioExterno = mView.UsuarioExterno };
                    mView.DatosPortafolio = fachada.BuscarPortafolioExterno(criterio);
                }
                else
                {
                    mView.DatosPortafolio = fachada.BuscarPortafolio(mView.PortafolioId, mView.FechaPortafolio);
                }              

                LlenarAporteYRetiro(mView.PortafolioId, PeriodosDelAnno.YearToDate, mView.Fecha, fachada);

            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                throw;
            }
        }


        private void LlenarAporteYRetiro(int p_IdPortafolio, PeriodosDelAnno p_PeriodosDelAnno, DateTime p_Fecha, FachadaPortafolio fachada)
        {

            DateTime t_FechaInicial = new DateTime();
            switch (p_PeriodosDelAnno)
            {
                case PeriodosDelAnno.YearToDate: 
                    {
                        t_FechaInicial = p_Fecha.BuscarFechaInicialDelAnno();
                    }break;
                case PeriodosDelAnno.QuarterToDate:
                    {
                        t_FechaInicial = p_Fecha.BuscarFechaInicialDelTrimestre();
                    }break;
                case PeriodosDelAnno.MonthToDate:
                    {
                        t_FechaInicial = p_Fecha.BuscarFechaInicialDelMes();
                    }break;
                case PeriodosDelAnno.DesdeInicio:
                    {
                        t_FechaInicial = new DateTime(1999, 1, 1);
                    }break;
            }

            
            ResumenAportesYRetiros resumen = fachada.BuscarResumenAportesYRetiros(p_IdPortafolio, t_FechaInicial, p_Fecha);
            mView.AporteYRetiro = resumen;

            List<AporteORetiro> t_Movimientos = fachada.BuscarAporteORetiros(p_IdPortafolio, t_FechaInicial, p_Fecha);

            mView.Aportes = t_Movimientos.Aportes();
            mView.Retiros = t_Movimientos.Retiros();

            List<double> listaFlujo = t_Movimientos.FlujoMensual(t_FechaInicial, mView.Fecha, resumen.NetoInicial, -resumen.NetoFinal);
            if (listaFlujo != null)
	        {
                try
                {
                    IRR irr = fachada.CalcularIRR(listaFlujo);
                    mView.RendimientoEnPeriodo = irr.TasaTotal;
                    
                    if (listaFlujo.Count > 12)
                    {
                        mView.MostrarRendimiento = true;
                        mView.RendimientoAnualizado = irr.TasaAnualizada;
                    }
                    else
                    {
                        mView.MostrarRendimiento = false;
                    }
                    
                }
                catch (Exception ex)
                {
                    mView.RendimientoEnPeriodo = 0;
                    if (listaFlujo.Count > 12)
                    {
                        mView.MostrarRendimiento = true;
                        mView.RendimientoAnualizado = 0;
                    }
                    else
                    {
                        mView.MostrarRendimiento = false;
                    }
                }
	        }
            else
            {
                mView.RendimientoEnPeriodo = 0;
                mView.MostrarRendimiento = false; 
            }
            
        }


    }


}
